【三维装箱】基于粒子群算法求解三维装箱问题matlab源码 | 您所在的位置:网站首页 › 三维装箱算法 有哪些 › 【三维装箱】基于粒子群算法求解三维装箱问题matlab源码 |
一、粒子群算法的概述
粒子群算法(PSO)属于群智能算法的一种,是通过模拟鸟群捕食行为设计的。假设区域里就只有一块食物(即通常优化问题中所讲的最优解),鸟群的任务是找到这个食物源。鸟群在整个搜寻的过程中,通过相互传递各自的信息,让其他的鸟知道自己的位置,通过这样的协作,来判断自己找到的是不是最优解,同时也将最优解的信息传递给整个鸟群,最终,整个鸟群都能聚集在食物源周围,即我们所说的找到了最优解,即问题收敛。 二、粒子群算法的流程 粒子群算法通过设计一种无质量的粒子来模拟鸟群中的鸟,粒子仅具有两个属性:速度 (PSO流程) 下面我们具体解释下流程图里面的每一个步骤: 1、初始化 首先,我们需要设置最大的速度区间,防止超出最大的区间。位置信息即为整个搜索空间,我们在速度区间和搜索空间上随机初始化速度和位置。设置群体规模 个体极值为每个粒子找到的历史上最优的位置信息,并从这些个体历史最优解中找到一个全局最优解,并与历史最优解比较,选出最佳的作为当前的历史最优解。 3、更新速度和位置的公式更新公式为: 其中, 有两种终止条件可以选择,一是最大代数: ``` clc;clear;close all; Vmax = 1;%速度限制 Vmin = -1; nodes=50;%节点数目 links=150;%边数目 dims=nodes(nodes-1)/2;%种群维数 c1 = 1.49445; c2 = 1.49445; maxgen = 300; %进化次数 sizepop = 100; %种群规模 % 惯性权重 w=1; % 线性递减惯性权重 w_max=0.9; w_min=0.4; pop=zeros(sizepop,dims);%初始化种群 trans_index=zeros(1,dims);%初始化转换索引 %% 产生初始粒子和速度 for iter = 1:sizepop %初始化种群 xx=randperm(nodes); yy=randperm(nodes); A=zeros(nodes,nodes);%连通阵,AA的迹为0 linkscount=1; while linkscounts edge_a="randi([1,nodes],1,1);%随机产生两个数,表示两个点的序号" edge_b="randi([1,nodes],1,1);" if a linkscount="linkscount+1;%表示成功的生成一个link" end else k="1;" for i="1:nodes" j="1:nodes">j) index=sub2ind(size(A),i,j); %取出对角线以上索引 pop(iter,k)=A(index);%按照索引展开为向量 trans_index(1,k)=index;%保存索引在向量转为邻接矩阵时使用 k=k+1; end end end disp(A); % % 将粒子向量转换为邻接矩阵,经验证可以正常恢复 % G=zeros(nodes,nodes); % [row col]=ind2sub(size(A),trans_index); % for s=1:length(trans_index) % G(row(s),col(s))=pop(iter,s); % end % G=G+G'; % sum(A(:)) V(iter,:) = (Vmax-Vmin)rand(1,dims)+Vmin; %初始化速度 %计算适应度 fitness(iter) = fitness_fun(A); %计算适应度 end %% 个体极值和群体极值 [bestfitness bestindex] = max(fitness); %bestindex:全局最优粒子索引 gbest = pop(bestindex,:); %全局最佳位置 pbest = pop; %个体最佳 fitnesspbest = fitness; %个体最佳适应度值 fitnessgbest = bestfitness; %全局最佳适应度值 %% 迭代寻优 for i = 1:maxgen %代数更迭 % w=-(4/300^2)i^2+4/300i+0.4; for j = 1:sizepop %遍历个体 % 速度更新 V(j,:) = wV(j,:) + c1rand(pbest(j,:) - pop(j,:)) + c2rand*(gbest - pop(j,:)); %速度边界处理 V(j,find(V(j,:)>Vmax)) = Vmax; V(j,find(V(j,:) W %随机挑选M-W个1变为0 index1=find(pop(j,:)==1); k=1; while k |
CopyRight 2018-2019 实验室设备网 版权所有 |